package functions

import (
	"fmt"
	zaplog "k8s_gui_client/log"
	"os/exec"
	"runtime"
	"strings"
)

// OpenFileDialog 打开文件选择对话框
// 返回选择的文件路径，如果用户取消则返回空字符串
func OpenFileDialog() (string, error) {
	var cmd *exec.Cmd
	var output []byte
	var err error

	// 根据不同操作系统使用不同的命令
	switch runtime.GOOS {
	case "windows":
		// 使用PowerShell脚本打开文件对话框
		powershellCmd := `Add-Type -AssemblyName System.Windows.Forms; 
		$openFileDialog = New-Object System.Windows.Forms.OpenFileDialog; 
		$openFileDialog.Filter = '所有文件|*.*|Kubernetes配置文件|*.yaml;*.yml;*.conf'; 
		$openFileDialog.Title = '选择Kubernetes配置文件'; 
		if ($openFileDialog.ShowDialog() -eq 'OK') { $openFileDialog.FileName }`
		cmd = exec.Command("powershell", "-Command", powershellCmd)

	case "darwin": // macOS
		// 使用osascript (AppleScript)
		cmd = exec.Command("osascript", "-e", `choose file with prompt "选择Kubernetes配置文件"`)

	case "linux":
		// 使用zenity (需要安装)
		cmd = exec.Command("zenity", "--file-selection", "--title=选择Kubernetes配置文件")

	default:
		return "", fmt.Errorf("不支持的操作系统: %s", runtime.GOOS)
	}

	// 执行命令
	output, err = cmd.Output()
	if err != nil {
		// 用户可能取消了选择，这种情况下不应该视为错误
		if exitErr, ok := err.(*exec.ExitError); ok {
			// 在某些平台上，取消选择会返回非零退出码
			zaplog.Logger.Info(fmt.Sprintf("文件选择被取消或发生错误: %v, stderr: %s", err, string(exitErr.Stderr)))
			return "", nil
		}
		zaplog.Logger.Error(fmt.Sprintf("打开文件对话框失败: %v", err))
		return "", err
	}

	// 处理输出
	filePath := strings.TrimSpace(string(output))
	if filePath == "" {
		// 用户可能取消了选择
		return "", nil
	}

	zaplog.Logger.Info(fmt.Sprintf("用户选择的文件: %s", filePath))
	return filePath, nil
}
